const fs = require('fs')
const config = require(process.cwd() + '/src/config/config')
const tiles = require(process.cwd() + '/src/utils/tiles')

const env = {
  init () {
    let data = {
      // 初始化每一行的图块数
      colNum: 8,
      // 初始化图集部分每一块的大小
      tilesWidth: 32,
      tilesHeight: 32,
      // 添加进来的Autotile信息
      autotiles: [],
      // 添加进来的图集图块信息
      tiles: []
    }
    return data
  },
  
  // 根据名字获取Env
  async getEnv (name) {
    const envPath = config.envPath + name + '.json'
    let data = await fs.promises.readFile(envPath)
    data = JSON.parse(data)
    return data
  },
  
  // 同步Env,将前端返回的数据与后端保存的数据同步
  setEnv (newData, oldData) {
    // autotiles直接赋予
    oldData.autotiles = newData.autotiles
    // tiles部分除了src,都进行更改
    const len = newData.tiles.length
    for (let i = 0; i < len; i++) {
      for (let key in oldData.tiles[i]) {
        if (key !== 'src' && key !== 'srcList') {
          oldData.tiles[i][key] = newData.tiles[i][key]
        }
      }
    }
    
    return oldData
  },
  
  // 同步图块数据
  setEnvTiles (envData, tilesData) {
    // 将图块大小,列数进行同步
    envData.colNum = tilesData.colNum
    envData.tilesWidth = tilesData.itemWidth
    envData.tilesHeight = tilesData.itemHeight
    
    // 同步图集
    const list = tilesData.list
    const len = list.length
    let envTilesList = []
    let envSrcTilesList = []
    for (let i = 0; i < len; i++) {
      const tile = list[i]
      let envTile = env.initTile(tile.id)
      // 顺便输出一份前端的src
      let envSrcTile = env.initSrcTransTile(tile.id, tilesData)
      envTilesList.push(envTile)
      envSrcTilesList.push(envSrcTile)
    }
    envData.tiles = envTilesList
    
    return {
      // 存储到文件中的数据
      data: envData,
      // 给前端返回的tiles列表
      tilesSrcList: envSrcTilesList
    }
  },
  
  /*
    定义游戏层级
    1.全景图层
    10.地表层
    20.可互动事物层 (一般是对角色有影响的地形/道具/门/机关等)
    30.地表景物层
    40.角色层 (敌人/NPC/主角)
    50.高处景物层
  */
  // 初始化公共数据
  initData () {
    let data = {}
    // 该物体的四方向连通性,0-7对应:左入/上入/右入/下入/左出/上出/右出/下出
    data.pass = [true, true, true, true, true, true, true, true]
    // 该物体的视野是否可以通过,0-3对应:向左/向上/向右/向下
    data.vision = [true, true, true, true]
    // 该物体所在的层级,大于30代表置予角色层之上,固定覆盖角色
    data.layer = 10
    return data
  },  
 
  // 初始化静态景物图块
  initTile (src) {
    let data = env.initData()
    data.src = src
    return data
  },
  
  // 初始化静态景物图块,返回前端的版本
  initSrcTransTile (src, tilesData) {
    const index = tilesData.list.findIndex(tile => tile.id === src)
    if (index >= 0) {
      src = config.imagesSrcPath + tilesData.name + '/' + tilesData.list[index].src
    }
    let data = env.initData()
    data.src = src
    return data
  },
  
  // 初始化Autotile
  initAutotile: async (autotile) => {
    let data = env.initData()
    data.autotile = autotile
    data.smallSrc = await tiles.getSmallAutotileSrc(autotile)
    return data
  }
}

module.exports = env